/**
 * 格式化工具函数
 */

import type { NumberFormatOptions, DateFormatOptions, FileSizeUnit } from './types'

/**
 * 格式化数字
 * @param value 数字值
 * @param options 格式化选项
 * @returns 格式化后的字符串
 */
export function formatNumber(value: number, options: NumberFormatOptions = {}): string {
  const {
    locale = 'zh-CN',
    style = 'decimal',
    currency = 'CNY',
    minimumFractionDigits,
    maximumFractionDigits,
    useGrouping = true
  } = options

  try {
    const formatter = new Intl.NumberFormat(locale, {
      style,
      currency: style === 'currency' ? currency : undefined,
      minimumFractionDigits,
      maximumFractionDigits,
      useGrouping
    })
    
    return formatter.format(value)
  } catch (error) {
    console.warn('Number format error:', error)
    return value.toString()
  }
}

/**
 * 格式化日期
 * @param date 日期对象或字符串
 * @param format 格式字符串（可选，使用简单格式）
 * @param options Intl.DateTimeFormat 选项
 * @returns 格式化后的日期字符串
 */
export function formatDate(
  date: Date | string | number,
  format?: string,
  options: DateFormatOptions = {}
): string {
  const dateObj = new Date(date)
  
  if (isNaN(dateObj.getTime())) {
    console.warn('Invalid date:', date)
    return 'Invalid Date'
  }

  // 如果提供了简单格式字符串
  if (format) {
    return formatDateWithPattern(dateObj, format)
  }

  // 使用 Intl.DateTimeFormat
  const {
    locale = 'zh-CN',
    year = 'numeric',
    month = '2-digit',
    day = '2-digit',
    hour,
    minute,
    second,
    weekday,
    timeZone
  } = options

  try {
    const formatter = new Intl.DateTimeFormat(locale, {
      year,
      month,
      day,
      hour,
      minute,
      second,
      weekday,
      timeZone
    })
    
    return formatter.format(dateObj)
  } catch (error) {
    console.warn('Date format error:', error)
    return dateObj.toLocaleDateString()
  }
}

/**
 * 使用模式格式化日期
 * @param date 日期对象
 * @param pattern 格式模式
 */
function formatDateWithPattern(date: Date, pattern: string): string {
  const year = date.getFullYear()
  const month = date.getMonth() + 1
  const day = date.getDate()
  const hour = date.getHours()
  const minute = date.getMinutes()
  const second = date.getSeconds()

  const formatMap: Record<string, string> = {
    'YYYY': year.toString(),
    'YY': year.toString().slice(-2),
    'MM': month.toString().padStart(2, '0'),
    'M': month.toString(),
    'DD': day.toString().padStart(2, '0'),
    'D': day.toString(),
    'HH': hour.toString().padStart(2, '0'),
    'H': hour.toString(),
    'mm': minute.toString().padStart(2, '0'),
    'm': minute.toString(),
    'ss': second.toString().padStart(2, '0'),
    's': second.toString()
  }

  let result = pattern
  Object.entries(formatMap).forEach(([key, value]) => {
    result = result.replace(new RegExp(key, 'g'), value)
  })

  return result
}

/**
 * 格式化文件大小
 * @param bytes 字节数
 * @param decimals 小数位数，默认为2
 * @returns 格式化后的文件大小字符串
 */
export function formatFileSize(bytes: number, decimals: number = 2): string {
  if (bytes === 0) return '0 B'
  
  const units: FileSizeUnit[] = [
    { name: 'B', value: 1 },
    { name: 'KB', value: 1024 },
    { name: 'MB', value: 1024 * 1024 },
    { name: 'GB', value: 1024 * 1024 * 1024 },
    { name: 'TB', value: 1024 * 1024 * 1024 * 1024 },
    { name: 'PB', value: 1024 * 1024 * 1024 * 1024 * 1024 }
  ]

  let unit = units[0]
  for (let i = units.length - 1; i >= 0; i--) {
    if (bytes >= units[i].value) {
      unit = units[i]
      break
    }
  }

  const size = bytes / unit.value
  const formattedSize = unit.name === 'B' ? size.toString() : size.toFixed(decimals)
  
  return `${formattedSize} ${unit.name}`
}

/**
 * 格式化百分比
 * @param value 数值（0-1之间）
 * @param decimals 小数位数，默认为2
 * @returns 格式化后的百分比字符串
 */
export function formatPercent(value: number, decimals: number = 2): string {
  const percent = (value * 100).toFixed(decimals)
  return `${percent}%`
}

/**
 * 格式化货币
 * @param value 金额
 * @param currency 货币代码，默认为 'CNY'
 * @param locale 地区代码，默认为 'zh-CN'
 * @returns 格式化后的货币字符串
 */
export function formatCurrency(value: number, currency: string = 'CNY', locale: string = 'zh-CN'): string {
  return formatNumber(value, {
    style: 'currency',
    currency,
    locale
  })
}

/**
 * 格式化千分位分隔符
 * @param value 数值
 * @param separator 分隔符，默认为 ','
 * @returns 格式化后的字符串
 */
export function formatThousands(value: number, separator: string = ','): string {
  const parts = value.toString().split('.')
  parts[0] = parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, separator)
  return parts.join('.')
}